home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacApp Release 10 / MacApp Release 10 - HD Ready / Examples / A-Z / Q / QuickTime / Simple QuickTime View / UQuickTime.cp < prev    next >
Encoding:
Text File  |  1996-04-03  |  37.5 KB  |  1,386 lines  |  [TEXT/MPS ]

  1. //----------------------------------------------------------------------------------------
  2. // UQuickTime.cp
  3. // Copyright © 1996 by Apple Computer, Inc. All rights reserved. 
  4. // Based on a contribution by Steven Friedrich
  5. //----------------------------------------------------------------------------------------
  6.  
  7. #ifndef __UQUICKTIME__
  8. #include "UQuickTime.h"
  9. #endif
  10.  
  11. //Toolbox
  12.  
  13. #ifndef __COMPONENTS__
  14. #include <Components.h>
  15. #endif
  16.  
  17. #ifndef __ERRORS__
  18. #include <Errors.h>
  19. #endif
  20.  
  21. #ifndef __FILES__
  22. #include <Files.h>
  23. #endif
  24.  
  25. #ifndef __GESTALTEQU__
  26. #include <GestaltEqu.h>
  27. #endif
  28.  
  29. #ifndef __STDIO__
  30. #include <StdIO.h>
  31. #endif
  32.  
  33. const CommandNumber cPlayEveryFrame = 1001;
  34. const CommandNumber cHalfSize = 1002;
  35. const CommandNumber cNormalSize = 1003;
  36. const CommandNumber cDoubleSize = 1004;
  37. const CommandNumber cLoop = 1005;
  38. const CommandNumber cAutoRewind = 1006;
  39. const CommandNumber cPlayWhenInactive = 1007;
  40.  
  41. //----------------------------------------------------------------------------------------
  42. // InitUQuickTime
  43. //----------------------------------------------------------------------------------------
  44. #pragma    segment    AOpen
  45.  
  46. void InitUQuickTime()
  47. {
  48.  
  49.     if (!HasQuickTime())                        // balk if QuickTime isn't present
  50.     {
  51. #if qDebug
  52.         ProgramBreak("InitUQuickTime called but QuickTime isn't present.");
  53. #endif
  54.  
  55.         return;
  56.     }
  57.  
  58.     // Initialize the QuickTime movie environment
  59.     FailOSErr(EnterMovies());
  60. }
  61.  
  62. //----------------------------------------------------------------------------------------
  63. // FailComponentErr
  64. //----------------------------------------------------------------------------------------
  65. #pragma    segment    ARes
  66.  
  67. void FailComponentErr(ComponentResult theResult)
  68. {
  69.     if (theResult)
  70.         ProgramBreak("A ComponentResultError has occured.");
  71. }
  72.  
  73. //========================================================================================
  74. // CLASS TMovie
  75. //========================================================================================
  76. #undef Inherited
  77. #define Inherited TObject
  78.  
  79. #pragma segment AInit
  80. MA_DEFINE_CLASS_M1(TMovie,
  81.                    Inherited);
  82.  
  83. //----------------------------------------------------------------------------------------
  84. // TMovie Constructor:
  85. //----------------------------------------------------------------------------------------
  86. #pragma    segment    AOpen
  87.  
  88. TMovie::TMovie() :
  89.     fOriginalBox(gZeroRect),
  90.     fMovie(NULL),
  91.     fPlayEveryFrame(FALSE)
  92. {
  93. }
  94.  
  95. //----------------------------------------------------------------------------------------
  96. // TMovie Destructor:
  97. //----------------------------------------------------------------------------------------
  98. #pragma    segment    AClose
  99.  
  100. TMovie::~TMovie()
  101. {
  102.     if (fMovie)
  103.         DisposeMovie(fMovie);
  104.  
  105.     fMovie = NULL;
  106. }
  107.  
  108. //----------------------------------------------------------------------------------------
  109. // TMovie::IMovie
  110. //----------------------------------------------------------------------------------------
  111. #pragma    segment    AOpen
  112.  
  113. void TMovie::IMovie(TFile* file)
  114. {
  115.     IObject();
  116.  
  117.     //
  118.     //    make a movie from the file
  119.     //
  120.     file->OpenFile();                            // in case it's not already open
  121.  
  122.     Movie newMovie;
  123.     short actualResID = (short)DoTheRightThing;
  124.     FailOSErr(NewMovieFromFile(&newMovie, file->fRsrcRefNum, &actualResID, NULL, newMovieActive, NULL));
  125.     fMovie = newMovie;
  126.  
  127.     //
  128.     // spruce up the movie bounds
  129.     //
  130.     CRect aRect(GetBox());
  131.     if (aRect.Empty())
  132.         aRect = CRect(20, 100, 200, 116);        // use a default size in this case
  133.  
  134.     SetBox(aRect - aRect[topLeft]);        // make sure the top left is 0,0
  135.     fOriginalBox = aRect - aRect[topLeft];
  136. }
  137.  
  138. //----------------------------------------------------------------------------------------
  139. // TMovie::GetDuration
  140. //----------------------------------------------------------------------------------------
  141. #pragma    segment    ARes
  142. TimeValue TMovie::GetDuration() const
  143. {
  144.     // ??? in seconds?
  145.     return GetMovieDuration(fMovie) / GetMovieTimeScale(fMovie);
  146. }
  147.  
  148. //----------------------------------------------------------------------------------------
  149. // TMovie::GetPoster
  150. //----------------------------------------------------------------------------------------
  151. #pragma    segment    ANonRes
  152.  
  153. PicHandle TMovie::GetPoster() const
  154. {
  155.     PicHandle picHandle = GetMoviePosterPict(fMovie);
  156.     CRect picFrame = (*picHandle)->picFrame;
  157.  
  158.     //    If the picture frame is empty, return a NULL handle
  159.     if (picHandle && picFrame.Empty())
  160.         picHandle = (PicHandle)DisposeIfHandle((Handle)picHandle);
  161.  
  162.     return picHandle;
  163. }
  164.  
  165. //----------------------------------------------------------------------------------------
  166. // TMovie::GetBox
  167. //----------------------------------------------------------------------------------------
  168. #pragma    segment    ANonRes
  169.  
  170. CRect TMovie::GetBox() const
  171. {
  172.     CRect itsBox;
  173.     GetMovieBox(fMovie, &itsBox);
  174.  
  175.     return itsBox;
  176. }
  177.  
  178. //----------------------------------------------------------------------------------------
  179. // TMovie::GetOriginalBox
  180. //----------------------------------------------------------------------------------------
  181. #pragma    segment    ANonRes
  182.  
  183. CRect TMovie::GetOriginalBox() const
  184. {
  185.     return fOriginalBox;
  186. }
  187.  
  188. //----------------------------------------------------------------------------------------
  189. // TMovie::SetBox
  190. //----------------------------------------------------------------------------------------
  191. #pragma    segment    ANonRes
  192.  
  193. void TMovie::SetBox(const CRect& itsBox)
  194. {
  195.     SetMovieBox(fMovie, itsBox);
  196. }
  197.  
  198. //----------------------------------------------------------------------------------------
  199. // TMovie::PutOnScrap
  200. //----------------------------------------------------------------------------------------
  201. #pragma segment AClipboard
  202.  
  203. OSErr TMovie::PutOnScrap(long movieScrapFlags)
  204. {
  205.     return PutMovieOnScrap(fMovie, movieScrapFlags);
  206. }
  207.  
  208. //----------------------------------------------------------------------------------------
  209. // TMovie::IsDone
  210. //----------------------------------------------------------------------------------------
  211. #pragma segment ARes
  212.  
  213. Boolean TMovie::IsDone() const
  214. {
  215.     return IsMovieDone(fMovie);
  216. }
  217.  
  218. //----------------------------------------------------------------------------------------
  219. // TMovie::IsPlaying
  220. //----------------------------------------------------------------------------------------
  221. #pragma segment ARes
  222.  
  223. Boolean TMovie::IsPlaying() const
  224. {
  225.     return (fPlayEveryFrame || GetMovieRate(fMovie) != 0) && !IsDone();
  226. }
  227.  
  228. //----------------------------------------------------------------------------------------
  229. // TMovie::Start
  230. //----------------------------------------------------------------------------------------
  231. #pragma segment ARes
  232.  
  233. void TMovie::Start()
  234. {
  235.     if (!fPlayEveryFrame)
  236.         StartMovie(fMovie);
  237. }
  238.  
  239. //----------------------------------------------------------------------------------------
  240. // TMovie::Stop
  241. //----------------------------------------------------------------------------------------
  242. #pragma segment ARes
  243.  
  244. void TMovie::Stop()
  245. {
  246.     if (!fPlayEveryFrame)
  247.         StopMovie(fMovie);
  248. }
  249.  
  250. //----------------------------------------------------------------------------------------
  251. // TMovie::SetPlayEveryFrame
  252. //----------------------------------------------------------------------------------------
  253. #pragma segment ARes
  254.  
  255. void TMovie::SetPlayEveryFrame(Boolean playEveryFrame)
  256. {
  257.     fPlayEveryFrame = playEveryFrame;
  258. }
  259.  
  260. //========================================================================================
  261. // CLASS TMovieViewIdler
  262. //========================================================================================
  263. #undef Inherited
  264. #define Inherited TEventHandler
  265.  
  266. #pragma segment AInit
  267. MA_DEFINE_CLASS_M1(TMovieViewIdler,
  268.                    Inherited);
  269.  
  270. //----------------------------------------------------------------------------------------
  271. // TMovieViewIdler Constructor
  272. //----------------------------------------------------------------------------------------
  273. #pragma    segment    ARes
  274.  
  275. TMovieViewIdler::TMovieViewIdler() :
  276.     fMovieView(NULL)
  277. {
  278. }
  279.  
  280. //----------------------------------------------------------------------------------------
  281. // TMovieViewIdler::IMovieViewIdler
  282. //----------------------------------------------------------------------------------------
  283. #pragma    segment    ARes
  284.  
  285. void TMovieViewIdler::IMovieViewIdler(TMovieView* itsMovieView)
  286. {
  287.     IEventHandler(NULL);
  288.  
  289.     fMovieView = itsMovieView;
  290. }
  291.  
  292. //----------------------------------------------------------------------------------------
  293. // TMovieViewIdler::DoIdle
  294. //----------------------------------------------------------------------------------------
  295. #pragma    segment    ARes
  296.  
  297. Boolean TMovieViewIdler::DoIdle(IdlePhase phase)
  298. {
  299.  
  300.     Boolean returnVal;
  301.     if (fMovieView && phase == idleContinue)
  302.         returnVal = !fMovieView->IdleMovies();    // if no longer playing then I got freed
  303.     else
  304.         returnVal = Inherited::DoIdle(phase);
  305.  
  306.     return FALSE;
  307. }
  308.  
  309. //========================================================================================
  310. // CLASS TMovieView
  311. //========================================================================================
  312. #undef Inherited
  313. #define Inherited TView
  314.  
  315. #pragma segment AInit
  316. MA_DEFINE_CLASS_M1(TMovieView,
  317.                    Inherited);
  318.  
  319. //----------------------------------------------------------------------------------------
  320. // TMovieView Constructor
  321. //----------------------------------------------------------------------------------------
  322. #pragma    segment    AOpen
  323.  
  324. TMovieView::TMovieView() :
  325.     fMovie(NULL),
  326.     fMovieController(NULL),
  327.     fPlayWhenInactive(FALSE),
  328.     fWasPlaying(FALSE),
  329.     fIdler(NULL),
  330.     fMovieClipIsValid(FALSE),
  331.     fLoop(FALSE),
  332.     fAutoRewind(FALSE)
  333. {
  334.     fMovieControllerIdentifier = kNoIdentifier;
  335. }
  336.  
  337. //----------------------------------------------------------------------------------------
  338. // TMovieView Destructor
  339. //----------------------------------------------------------------------------------------
  340. #pragma    segment    AClose
  341.  
  342. TMovieView::~TMovieView()
  343. {
  344.     if (fIdler)
  345.     {
  346.         gApplication->InstallCohandler(fIdler, FALSE);
  347.         fIdler = (TMovieViewIdler *)FreeIfObject(fIdler);
  348.     }
  349.  
  350.     if (fMovieController)
  351.         fMovieController->AttachMovieView(NULL);
  352.     fMovieController = NULL;
  353. }
  354.  
  355. //----------------------------------------------------------------------------------------
  356. // TMovieView::DoPostCreate
  357. //----------------------------------------------------------------------------------------
  358. #pragma    segment    AOpen
  359.  
  360. void TMovieView::DoPostCreate(TDocument* itsDocument)
  361. {
  362.     fMovieControllerIdentifier = 'MCtl';        //### temporary until new template is available
  363.  
  364.     Inherited::DoPostCreate(itsDocument);
  365.  
  366.     fLoop = FALSE;
  367.     fAutoRewind = FALSE;
  368.  
  369.     fMovieSize[hSel] = normalSize;
  370.     fMovieSize[vSel] = normalSize;
  371.  
  372.     SetMovieSize(fMovieSize[hSel], fMovieSize[vSel]);
  373.     if (fSuperView)
  374.     {
  375.         if (fMovieControllerIdentifier != kNoIdentifier)
  376.         {
  377.             TMovieController * itsController = (TMovieController *)GetRootView()->FindSubView(fMovieControllerIdentifier);
  378.             if (itsController)
  379.                 itsController->AttachMovieView(this);
  380. #if qDebugMsg
  381.             else
  382.             {
  383.                 IDType itsID = fMovieControllerIdentifier;
  384.                 fprintf(stderr, "###In TMovieView::DoPostCreate, can't find MovieController: %.4s\n", (char*) & itsID);
  385.             }
  386. #endif
  387.  
  388.         }
  389.     }
  390. }
  391.  
  392. //----------------------------------------------------------------------------------------
  393. // TMovieView::HaveMovie
  394. //----------------------------------------------------------------------------------------
  395. #pragma    segment    AOpen
  396.  
  397. void TMovieView::HaveMovie(TMovie* movie)
  398. {
  399.     fMovie = movie;
  400.  
  401.     Focus();
  402.  
  403.     if (fMovie)
  404.         SetMovieGWorld(fMovie->GetMovie(), (CGrafPtr)GetGrafPort(), NULL);
  405.  
  406.     if (fMovieController)
  407.         fMovieController->HaveMovie(fMovie);
  408.  
  409.     AdjustFrame();
  410.     if (fSuperView)
  411.         fSuperView->AdjustFrame();
  412.  
  413.     SetMovieSize(fMovieSize[hSel], fMovieSize[vSel]);
  414. }
  415.  
  416. //----------------------------------------------------------------------------------------
  417. // TMovieView::SetLoop
  418. //----------------------------------------------------------------------------------------
  419. #pragma    segment    ARes
  420.  
  421. void TMovieView::SetLoop(Boolean loop)
  422. {
  423.     fLoop = loop;
  424.  
  425.     if (fMovieController)
  426.         FailComponentErr(MCDoAction(fMovieController->GetController(), mcActionSetLooping, (Ptr)fLoop));
  427. }
  428.  
  429. //----------------------------------------------------------------------------------------
  430. // TMovieView::SetMovieSize
  431. //----------------------------------------------------------------------------------------
  432. #pragma    segment    ARes
  433.  
  434. void TMovieView::SetMovieSize(VariableMovieSize newSizeH,
  435.                               VariableMovieSize newSizeV)
  436. {
  437.     fMovieSize[hSel] = newSizeH;
  438.     fMovieSize[vSel] = newSizeV;
  439.  
  440.     if (GetMovie())
  441.     {
  442.         CRect box(GetMovie()->GetOriginalBox());
  443.  
  444.         // Adjust view size based on size determiners. 
  445.         for (VHSelect vhs = vSel; vhs <= hSel; ++vhs)
  446.         {
  447.             if (fSizeDeterminer[vhs] == sizeVariable)
  448.                 switch (fMovieSize[vhs])
  449.                 {
  450.                     case halfSize:
  451.                         box[botRight][vhs] /= 2;
  452.                         break;
  453.  
  454.                     case doubleSize:
  455.                         box[botRight][vhs] *= 2;
  456.                         break;
  457.                 }
  458.             else
  459.                 box[botRight][vhs] = fSize[vhs] - 1;
  460.         }
  461.  
  462.         SetFrame(VRect(box), kInvalidate);
  463.     }
  464. }
  465.  
  466. //----------------------------------------------------------------------------------------
  467. // TMovieView::SetPlayWhenInactive
  468. //----------------------------------------------------------------------------------------
  469. #pragma    segment    ARes
  470.  
  471. Boolean TMovieView::SetPlayWhenInactive(Boolean shouldPlay)
  472. {
  473.     Boolean returnVal = fPlayWhenInactive;
  474.  
  475.     if (fPlayWhenInactive != shouldPlay)
  476.     {
  477.         fPlayWhenInactive = shouldPlay;
  478.  
  479.         if (!fIsActive && fWasPlaying)
  480.             fMovie->Start();
  481.  
  482.         IdleMovies();
  483.     }
  484.  
  485.     return returnVal;
  486. }
  487.  
  488. //----------------------------------------------------------------------------------------
  489. // TMovieView::SetFrame
  490. //----------------------------------------------------------------------------------------
  491. #pragma    segment    AOpen
  492.  
  493. void TMovieView::SetFrame(const VRect& newFrame,
  494.                           Boolean invalidate)
  495. {
  496.     if (newFrame != GetFrame())
  497.     {
  498.         Inherited::SetFrame(newFrame, invalidate);
  499.  
  500.         if (invalidate)
  501.             ForceRedraw();
  502.  
  503.         AdjustOffsetsForController();
  504.  
  505.         if (fMovieController)
  506.             fMovieController->MovieChangedFrame(newFrame, invalidate);
  507.  
  508.     }
  509. }
  510.  
  511. //----------------------------------------------------------------------------------------
  512. // TMovieView::BeInPort
  513. //----------------------------------------------------------------------------------------
  514. #pragma    segment    AOpen
  515.  
  516. void TMovieView::BeInPort(GrafPtr itsPort)        // override 
  517. {
  518.     Inherited::BeInPort(itsPort);
  519.  
  520.     if (fMovie)
  521.         SetMovieGWorld(fMovie->GetMovie(), (CGrafPtr)itsPort, NULL);
  522. }
  523.  
  524. //----------------------------------------------------------------------------------------
  525. // TMovieView::Draw
  526. //----------------------------------------------------------------------------------------
  527. #pragma segment ARes
  528.  
  529. void TMovieView::Draw(const VRect&                /*area*/ )
  530. {
  531.     if (fMovie)
  532.     {
  533.         Boolean wasActive = TRUE;
  534.         if (!IsPlaying())
  535.         {
  536.             wasActive = GetMovieActive(fMovie->GetMovie());
  537.             if (wasActive)
  538.                 SetMovieActive(fMovie->GetMovie(), TRUE);
  539.         }
  540.  
  541.         UpdateMovie(fMovie->GetMovie());
  542.         MoviesTask(fMovie->GetMovie(), 0);
  543.  
  544.         if (!IsPlaying())
  545.         {
  546.             if (!wasActive)
  547.                 SetMovieActive(fMovie->GetMovie(), wasActive);
  548.         }
  549.     }
  550. }
  551.  
  552. //----------------------------------------------------------------------------------------
  553. // TMovieView::Focus
  554. //----------------------------------------------------------------------------------------
  555. #pragma segment ARes
  556.  
  557. Boolean TMovieView::Focus()
  558. {
  559.     Boolean returnVal = Inherited::Focus();
  560.  
  561.     //    keep the movie up to date with our coordinate sys… only if absolutely necessary
  562.     if (returnVal && !fMovieClipIsValid)
  563.     {
  564.         CTemporaryRegion visRgn;
  565.         GetVisibleRegion(visRgn);
  566.  
  567.         if (fMovieController && fMovieController->GetController())
  568.             FailComponentErr(MCSetClip(fMovieController->GetController(), NULL, visRgn));
  569.         else if (fMovie)
  570.             SetMovieDisplayClipRgn(fMovie->GetMovie(), visRgn);
  571.  
  572.         fMovieClipIsValid = TRUE;
  573.     }
  574.  
  575.     return returnVal;
  576. }
  577.  
  578. //----------------------------------------------------------------------------------------
  579. // TMovieView::InvalidateMovieClip
  580. //----------------------------------------------------------------------------------------
  581. #pragma segment ARes
  582.  
  583. void TMovieView::InvalidateMovieClip()
  584. {
  585.     fMovieClipIsValid = FALSE;
  586. }
  587.  
  588. //----------------------------------------------------------------------------------------
  589. // TMovieView::EnsureMovieClipIsValid
  590. //----------------------------------------------------------------------------------------
  591. #pragma segment ARes
  592.  
  593. void TMovieView::EnsureMovieClipIsValid()
  594. {
  595.     if (!fMovieClipIsValid)
  596.         Focus();
  597. }
  598.  
  599. //----------------------------------------------------------------------------------------
  600. // TMovieView::Activate
  601. //----------------------------------------------------------------------------------------
  602. #pragma segment ARes
  603.  
  604. void TMovieView::Activate(Boolean entering)
  605. {
  606.     Inherited::Activate(entering);
  607.  
  608.     if (entering != fIsActive)
  609.     {
  610.         fIsActive = entering;
  611.  
  612.         if (!fPlayWhenInactive)
  613.             if (entering)
  614.             {
  615.                 if (fWasPlaying)
  616.                     fMovie->Start();
  617.             }
  618.             else
  619.             {
  620.                 fWasPlaying = IsPlaying();
  621.                 fMovie->Stop();
  622.             }
  623.         IdleMovies();
  624.     }
  625. }
  626.  
  627. //----------------------------------------------------------------------------------------
  628. // TMovieView::HaveMovieController
  629. //----------------------------------------------------------------------------------------
  630. #pragma segment ARes
  631.  
  632. void TMovieView::HaveMovieController(TMovieController* itsMovieController)
  633. {
  634.     fMovieController = itsMovieController;
  635.  
  636.     AdjustOffsetsForController();
  637.  
  638.     if (fMovieController && fMovie)
  639.         fMovieController->HaveMovie(fMovie);
  640. }
  641.  
  642. //----------------------------------------------------------------------------------------
  643. // TMovieView::AdjustOffsetsForController
  644. //----------------------------------------------------------------------------------------
  645. #pragma segment ARes
  646.  
  647. void TMovieView::AdjustOffsetsForController()
  648. {
  649.     if (fMovieController && Focus())
  650.     {
  651.         // reset to zero every time
  652.         SetLocalOrigin(gZeroVPt, kDontRedraw);
  653.  
  654.         // calculate the distance between us and the controller
  655.         CRect movieQDRect(GetQDExtent());
  656.         VPoint movieLocation(QDToViewPt(movieQDRect[topLeft]));
  657.  
  658.         LocalToWindow(movieLocation);
  659.         fMovieController->WindowToLocal(movieLocation);
  660.  
  661.         CPoint movieControllerQDOffset(fMovieController->ViewToQDPt(movieLocation));
  662.  
  663.         if (fMovie)
  664.             fMovie->SetBox(movieQDRect + movieControllerQDOffset);
  665.  
  666.         SetLocalOrigin(VPoint(gZeroPt - movieControllerQDOffset), kDontRedraw);
  667.  
  668.         if (fMovie)
  669.             MCMovieChanged(fMovieController->GetController(), fMovie->GetMovie());
  670.  
  671.         InvalidateMovieClip();
  672.     }
  673. }
  674.  
  675. //----------------------------------------------------------------------------------------
  676. // TMovie::HasMovie
  677. //----------------------------------------------------------------------------------------
  678. #pragma    segment    ARes
  679. Boolean TMovieView::HasMovie() const
  680. {
  681.     //not totally safe - could have a movie object with no fMovie...change
  682.     return fMovie ? TRUE : FALSE;
  683. }
  684. //----------------------------------------------------------------------------------------
  685. // TMovieView::DoMouseCommand
  686. //----------------------------------------------------------------------------------------
  687. #pragma segment ARes
  688.  
  689. void TMovieView::DoMouseCommand(VPoint& theMouse,
  690.                                 TToolboxEvent* event,
  691.                                 CPoint hysteresis)
  692. {
  693.     // if a movieController is attached pass off mouse clicks to it
  694.     if (IsEnabled())
  695.     {
  696.         if (fMovieController)
  697.         {
  698.             LocalToWindow(theMouse);
  699.             fMovieController->WindowToLocal(theMouse);
  700.             if (fMovieController->Focus())
  701.                 fMovieController->DoMouseCommand(theMouse, event, hysteresis);
  702.         }
  703.         else
  704.         {
  705.             if (event->fClickCount > 1)
  706.             {
  707.                 if (fMovie->IsDone())
  708.                     GoToBeginningOfMovie(fMovie->GetMovie());
  709.                 fMovie->Start();
  710.             }
  711.             else
  712.                 fMovie->Stop();
  713.             IdleMovies();
  714.         }
  715.     }
  716.     else
  717.         Inherited::DoMouseCommand(theMouse, event, hysteresis);
  718. }
  719.  
  720. //----------------------------------------------------------------------------------------
  721. // TMovieView::SetIdleIfMoviePlaying
  722. //----------------------------------------------------------------------------------------
  723. #pragma segment ARes
  724.  
  725. Boolean TMovieView::SetIdleIfMoviePlaying()
  726. {
  727.     const long kMagicIdleNumber = 1;
  728.  
  729.     if (fLoop && fMovie && fMovie->IsDone())
  730.         GoToBeginningOfMovie(fMovie->GetMovie());
  731.  
  732.     if (fAutoRewind && fMovie && fMovie->IsDone())
  733.     {
  734.         GoToBeginningOfMovie(fMovie->GetMovie());
  735.         IdleMovies();                        // since we will stop the idling process the frame wouldn't redraw
  736.     }
  737.  
  738.     Boolean returnVal = IsPlaying();
  739.  
  740.     if (returnVal)
  741.     {
  742.         if (!fIdler)
  743.         {
  744.             fIdler = new TMovieViewIdler;
  745.             fIdler->IMovieViewIdler(this);
  746.             gApplication->InstallCohandler(fIdler, TRUE);
  747.         }
  748.         fIdler->SetIdleFreq(kMagicIdleNumber);
  749.     }
  750.     else
  751.     {
  752.         if (fIdler)
  753.             fIdler->SetIdleFreq(kMaxIdleTime);
  754.     }
  755.  
  756.     return returnVal;
  757. }
  758. //----------------------------------------------------------------------------------------
  759. // TMovieView::IsPlaying
  760. //----------------------------------------------------------------------------------------
  761. #pragma segment ARes
  762.  
  763. Boolean TMovieView::IsPlaying() const
  764. {
  765.     Boolean returnVal = FALSE;
  766.  
  767.     if (fMovie)
  768.         returnVal = fMovie->IsPlaying();
  769.  
  770.     return returnVal;
  771. }
  772.  
  773. //----------------------------------------------------------------------------------------
  774. // TMovieView::IdleMovies
  775. //----------------------------------------------------------------------------------------
  776. #pragma    segment    ARes
  777.  
  778. Boolean TMovieView::IdleMovies()
  779. {
  780.     if (fMovieController)
  781.         fMovieController->IdleMovies();
  782.     else
  783.     {
  784.         if (fMovie && Focus())
  785.             MoviesTask(fMovie->GetMovie(), 0);
  786.     }
  787.  
  788.     return SetIdleIfMoviePlaying();
  789. }
  790.  
  791.  
  792. //----------------------------------------------------------------------------------------
  793. // TMovieView::InvalidateCoordinates
  794. //----------------------------------------------------------------------------------------
  795. #pragma segment ARes
  796.  
  797. void TMovieView::InvalidateCoordinates()
  798. {
  799.     Inherited::InvalidateCoordinates();
  800.  
  801.     InvalidateMovieClip();
  802. }
  803.  
  804. //----------------------------------------------------------------------------------------
  805. // TMovieView::IsActive
  806. //----------------------------------------------------------------------------------------
  807. #pragma    segment    ARes
  808.  
  809. Boolean TMovieView::IsActive()
  810. {
  811.     return fIsActive && Inherited::IsActive();
  812. }
  813.  
  814. //----------------------------------------------------------------------------------------
  815. // TMovieView::ComputeFrame
  816. //----------------------------------------------------------------------------------------
  817. #pragma segment ARes
  818.  
  819. void TMovieView::ComputeFrame(VRect& newFrame)
  820. {
  821.     Inherited::ComputeFrame(newFrame);
  822.  
  823.     if (fMovie)
  824.     {
  825.         CRect box(fMovie->GetBox());
  826.  
  827.         if (fSizeDeterminer[hSel] == sizeVariable)
  828.             newFrame.right = newFrame.left + box.GetLength(hSel);
  829.  
  830.         if (fSizeDeterminer[vSel] == sizeVariable)
  831.             newFrame.bottom = newFrame.top + box.GetLength(vSel);
  832.     }
  833. }
  834.  
  835. //----------------------------------------------------------------------------------------
  836. // TMovieView::DoMenuCommand
  837. //----------------------------------------------------------------------------------------
  838. #pragma segment ARes
  839.  
  840. void TMovieView::DoMenuCommand(CommandNumber aCommandNumber)// override 
  841. {
  842.     switch (aCommandNumber)
  843.     {
  844.         case cAutoRewind:
  845.             fAutoRewind = !fAutoRewind;
  846.             break;
  847.  
  848.         case cLoop:
  849.             SetLoop(!fLoop);
  850.             break;
  851.  
  852.         case cPlayWhenInactive:
  853.             SetPlayWhenInactive(!fPlayWhenInactive);
  854.             break;
  855.  
  856.         case cHalfSize:
  857.         case cNormalSize:
  858.         case cDoubleSize:
  859.             switch (aCommandNumber)
  860.             {
  861.                 case cHalfSize:
  862.                     SetMovieSize(halfSize, halfSize);
  863.                     break;
  864.  
  865.                 case cNormalSize:
  866.                     SetMovieSize(normalSize, normalSize);
  867.                     break;
  868.  
  869.                 case cDoubleSize:
  870.                     SetMovieSize(doubleSize, doubleSize);
  871.                     break;
  872.             }
  873.             break;
  874.  
  875.         default:
  876.             Inherited::DoMenuCommand(aCommandNumber);
  877.             break;
  878.     }
  879. }
  880.  
  881.  
  882. //========================================================================================
  883. // CLASS TMovieController
  884. //========================================================================================
  885. #undef Inherited
  886. #define Inherited TView
  887.  
  888. #pragma segment AInit
  889. MA_DEFINE_CLASS_M1(TMovieController,
  890.                    Inherited);
  891.  
  892. //----------------------------------------------------------------------------------------
  893. // TMovieView Constructor
  894. //----------------------------------------------------------------------------------------
  895. #pragma    segment    AOpen
  896.  
  897. TMovieController::TMovieController() :
  898.     fMovieController(NULL),
  899.     fMovieView(NULL),
  900.     fIsActive(NULL),
  901.     fPlayEveryFrame(NULL),
  902.     fAutoSizeToMovie(TRUE)
  903. {
  904. }
  905.  
  906. //----------------------------------------------------------------------------------------
  907. // TMovieView Destructor
  908. //----------------------------------------------------------------------------------------
  909. #pragma segment ARes
  910.  
  911. TMovieController::~TMovieController()
  912. {
  913.     if (fMovieView)
  914.         fMovieView->HaveMovieController(NULL);
  915.     fMovieView = NULL;
  916.  
  917.     if (fMovieController)
  918.         CloseComponent(fMovieController);
  919.     fMovieController = NULL;
  920. }
  921.  
  922.  
  923. //----------------------------------------------------------------------------------------
  924. // TMovieView::DoPostCreate
  925. //----------------------------------------------------------------------------------------
  926. #pragma    segment    AOpen
  927.  
  928. void TMovieController::DoPostCreate(TDocument* itsDocument)
  929. {
  930.     Inherited::DoPostCreate(itsDocument);
  931.  
  932.     fMovieController = (MovieController)OpenDefaultComponent(MovieControllerComponentType, kAnyComponentSubType);
  933.     FailNIL(fMovieController);
  934.  
  935.     BeInPort(GetGrafPort());
  936.     FailComponentErr(MCSetVisible(fMovieController, fShown));
  937.     FailComponentErr(MCDoAction(fMovieController, mcActionSetKeysEnabled, (Ptr)TRUE));
  938.  
  939.     SetPlayEveryFrame(fPlayEveryFrame);
  940. }
  941.  
  942. //----------------------------------------------------------------------------------------
  943. // TMovieView::SetFrame
  944. //----------------------------------------------------------------------------------------
  945. #pragma    segment    AOpen
  946.  
  947. void TMovieController::SetFrame(const VRect& newFrame,
  948.                                 Boolean invalidate)
  949. {
  950.     Inherited::SetFrame(newFrame, invalidate);
  951.  
  952.     if (invalidate)
  953.         ForceRedraw();
  954.  
  955.     if (fMovieController)
  956.         FailComponentErr(MCSetControllerBoundsRect(fMovieController, &GetQDExtent()));
  957.  
  958.     if (fMovieView)
  959.         fMovieView->AdjustOffsetsForController();
  960. }
  961.  
  962. //----------------------------------------------------------------------------------------
  963. // TMovieView::Show
  964. //----------------------------------------------------------------------------------------
  965. #pragma    segment    AOpen
  966.  
  967. void TMovieController::Show(Boolean state,
  968.                             Boolean redraw)
  969. {
  970.     Inherited::Show(state, redraw);
  971.  
  972.     FailComponentErr(MCSetVisible(fMovieController, state));
  973. }
  974.  
  975. //----------------------------------------------------------------------------------------
  976. // TMovieView::BeInPort
  977. //----------------------------------------------------------------------------------------
  978. #pragma    segment    AOpen
  979.  
  980. void TMovieController::BeInPort(GrafPtr itsPort)// override 
  981. {
  982.     Inherited::BeInPort(itsPort);
  983.  
  984.     if (fMovieController)
  985.         FailComponentErr(MCSetControllerPort(fMovieController, (CGrafPtr)itsPort));
  986. }
  987.  
  988. //----------------------------------------------------------------------------------------
  989. // TMovieView::IdleMovies
  990. //----------------------------------------------------------------------------------------
  991. #pragma    segment    ARes
  992.  
  993. void TMovieController::IdleMovies()
  994. {
  995.     if (Focus())
  996.         FailComponentErr(MCIdle(fMovieController));
  997. }
  998.  
  999. //----------------------------------------------------------------------------------------
  1000. // TMovieView::DoEvent
  1001. //----------------------------------------------------------------------------------------
  1002. #pragma segment ARes
  1003.  
  1004. void TMovieController::DoEvent(EventNumber eventNumber,
  1005.                                TEventHandler* source,
  1006.                                TEvent* event)
  1007. {
  1008.     if (eventNumber == mBecameTarget)
  1009.         Activate(TRUE);
  1010.     else if (eventNumber == mResignedTarget)
  1011.         Activate(FALSE);
  1012.  
  1013.     Inherited::DoEvent(eventNumber, source, event);
  1014. }
  1015.  
  1016. //----------------------------------------------------------------------------------------
  1017. // TMovieView::DoMouseCommand
  1018. //----------------------------------------------------------------------------------------
  1019. #pragma segment ARes
  1020.  
  1021. void TMovieController::DoMouseCommand(VPoint& theMouse,
  1022.                                       TToolboxEvent* event,
  1023.                                       CPoint hysteresis)
  1024. {
  1025.     Boolean handled = FALSE;
  1026.  
  1027.     if (IsEnabled())
  1028.     {
  1029.         handled = MCClick(fMovieController, GetGrafPort(), ViewToQDPt(theMouse), event->fEventRecords[0].when, event->fEventRecords[0].modifiers);
  1030.         if (handled)
  1031.         {
  1032.             if (fMovieView)
  1033.                 fMovieView->IdleMovies();
  1034.             else
  1035.                 IdleMovies();
  1036.         }
  1037.     }
  1038.  
  1039.     if (!handled)
  1040.         Inherited::DoMouseCommand(theMouse, event, hysteresis);
  1041. }
  1042.  
  1043. //----------------------------------------------------------------------------------------
  1044. // TMovieView::DoKeyEvent
  1045. //----------------------------------------------------------------------------------------
  1046. #pragma segment ARes
  1047.  
  1048. void TMovieController::DoKeyEvent(TToolboxEvent* event)// override 
  1049. {
  1050.     Boolean handled = FALSE;
  1051.  
  1052.     if (IsEnabled() && Focus())
  1053.     {
  1054.         handled = MCKey(fMovieController, event->fText[1], event->fEventRecords[0].modifiers);
  1055.         if (event->fDoubleEvent)
  1056.             handled = MCKey(fMovieController, event->fText[2], event->fEventRecords[1].modifiers);
  1057.  
  1058.         if (handled)
  1059.         {
  1060.             if (fMovieView)
  1061.                 fMovieView->IdleMovies();
  1062.             else
  1063.                 IdleMovies();
  1064.         }
  1065.     }
  1066.  
  1067.     if (!handled)
  1068.         Inherited::DoKeyEvent(event);
  1069. }
  1070.  
  1071. //----------------------------------------------------------------------------------------
  1072. // TMovieView::DoCommandKeyEvent
  1073. //----------------------------------------------------------------------------------------
  1074. #pragma segment ARes
  1075.  
  1076. void TMovieController::DoCommandKeyEvent(TToolboxEvent* event)// override 
  1077. {
  1078.     Boolean handled = FALSE;
  1079.  
  1080.     if (IsEnabled() && Focus())
  1081.     {
  1082.         handled = MCKey(fMovieController, event->fText[1], event->fEventRecords[0].modifiers);
  1083.         if (event->fDoubleEvent)
  1084.             handled = MCKey(fMovieController, event->fText[2], event->fEventRecords[1].modifiers);
  1085.  
  1086.         if (handled)
  1087.         {
  1088.             if (fMovieView)
  1089.                 fMovieView->IdleMovies();
  1090.             else
  1091.                 IdleMovies();
  1092.         }
  1093.     }
  1094.  
  1095.     if (!handled)
  1096.         Inherited::DoKeyEvent(event);
  1097. }
  1098.  
  1099. //----------------------------------------------------------------------------------------
  1100. // TMovieView::Draw
  1101. //----------------------------------------------------------------------------------------
  1102. #pragma segment ARes
  1103.  
  1104. void TMovieController::Draw(const VRect&        /*area*/ )
  1105. {
  1106.     // I only want to draw the controller not the associated movie. (It will draw itself)
  1107.     // So I set the movie's clip to empty in order to defeat the drawing of the movie that
  1108.     // would otherwise occur here. When finished I restore the original movie clipping.
  1109.  
  1110.     RgnHandle oldClip;
  1111.     FailComponentErr(MCGetClip(fMovieController, NULL, &oldClip));
  1112.  
  1113.     CTemporaryRegion emptyClip;
  1114.     SetEmptyRgn(emptyClip);
  1115.     FailComponentErr(MCSetClip(fMovieController, qd.thePort->clipRgn, emptyClip));
  1116.  
  1117.     FailComponentErr(MCDraw(fMovieController, GetGrafPort()));
  1118.  
  1119.     FailComponentErr(MCSetClip(fMovieController, NULL, oldClip));
  1120. }
  1121.  
  1122. //----------------------------------------------------------------------------------------
  1123. // TMovieView::Focus
  1124. //----------------------------------------------------------------------------------------
  1125. #pragma segment ARes
  1126.  
  1127. Boolean TMovieController::Focus()
  1128. {
  1129.     if (fMovieView)
  1130.         fMovieView->EnsureMovieClipIsValid();
  1131.  
  1132.     return Inherited::Focus();
  1133. }
  1134.  
  1135. //----------------------------------------------------------------------------------------
  1136. // TMovieView::Activate
  1137. //----------------------------------------------------------------------------------------
  1138. #pragma segment ARes
  1139.  
  1140. void TMovieController::Activate(Boolean entering)
  1141. {
  1142.     Inherited::Activate(entering);
  1143.  
  1144.     if (entering != fIsActive)
  1145.     {
  1146.         fIsActive = entering;
  1147.  
  1148.         SetActive(entering);
  1149.     }
  1150. }
  1151.  
  1152. //----------------------------------------------------------------------------------------
  1153. // TMovieView::SetActive
  1154. //----------------------------------------------------------------------------------------
  1155. #pragma segment ARes
  1156.  
  1157. void TMovieController::SetActive(Boolean state)
  1158. {
  1159.     Focus();
  1160.  
  1161.     FailComponentErr(MCActivate(fMovieController, GetGrafPort(), state));
  1162.  
  1163.     // Because Movie ToolBox invalidates the extent of the control but we do
  1164.     // direct drawing in the unclipped area.
  1165.  
  1166.     CTemporaryRegion visibleRgn;
  1167.     GetVisibleRegion(visibleRgn);
  1168.  
  1169.     ValidateRegion(visibleRgn);
  1170.  
  1171.     DrawContents();                        // draw in activated or deactivated state
  1172. }
  1173.  
  1174.  
  1175. //----------------------------------------------------------------------------------------
  1176. // TMovieView::AttachMovieView
  1177. //----------------------------------------------------------------------------------------
  1178. #pragma segment ARes
  1179.  
  1180. void TMovieController::AttachMovieView(TMovieView* itsMovieView)
  1181. {
  1182.     fMovieView = itsMovieView;
  1183.     if (fMovieView)
  1184.         fMovieView->HaveMovieController(this);
  1185. }
  1186.  
  1187.  
  1188. //----------------------------------------------------------------------------------------
  1189. // TMovieView::HaveMovie
  1190. //----------------------------------------------------------------------------------------
  1191. #pragma segment ARes
  1192.  
  1193. void TMovieController::HaveMovie(TMovie* itsMovie)
  1194. {
  1195.     FailComponentErr(MCSetMovie(fMovieController, itsMovie ? itsMovie->GetMovie() : NULL, fMovieView ? fMovieView->GetGrafPort() : GetGrafPort(), gZeroPt));
  1196.     FailComponentErr(MCSetControllerAttached(fMovieController, FALSE));
  1197.     FailComponentErr(MCDoAction(fMovieController, mcActionSetLooping, fMovieView ? (Ptr)fMovieView->fLoop : FALSE));
  1198.  
  1199.     SetPlayEveryFrame(fPlayEveryFrame);
  1200.  
  1201.     AdjustFrame();
  1202.     if (fSuperView)
  1203.         fSuperView->AdjustFrame();
  1204. }
  1205.  
  1206. //----------------------------------------------------------------------------------------
  1207. // TMovieView::SetIdleIfMoviePlaying
  1208. //----------------------------------------------------------------------------------------
  1209. #pragma segment ARes
  1210.  
  1211. Boolean TMovieController::SetIdleIfMoviePlaying()
  1212. {
  1213.     Boolean returnVal = FALSE;
  1214.  
  1215.     if (fMovieView)
  1216.         returnVal = fMovieView->SetIdleIfMoviePlaying();
  1217.  
  1218.     return returnVal;
  1219. }
  1220.  
  1221. //----------------------------------------------------------------------------------------
  1222. // TMovieView::IsPlaying
  1223. //----------------------------------------------------------------------------------------
  1224. #pragma segment ARes
  1225.  
  1226. Boolean TMovieController::IsPlaying() const
  1227. {
  1228.     return fMovieView ? fMovieView->IsPlaying() : FALSE;
  1229. }
  1230.  
  1231. //----------------------------------------------------------------------------------------
  1232. // TMovieView::IsActive
  1233. //----------------------------------------------------------------------------------------
  1234. #pragma    segment    ARes
  1235.  
  1236. Boolean TMovieController::IsActive()
  1237. {
  1238.     return fIsActive && Inherited::IsActive();
  1239. }
  1240.  
  1241. //----------------------------------------------------------------------------------------
  1242. // TMovieView::MovieChangedFrame
  1243. //----------------------------------------------------------------------------------------
  1244. #pragma    segment    AOpen
  1245.  
  1246. void TMovieController::MovieChangedFrame(const VRect&/*newFrame*/  ,
  1247.                                          Boolean/*invalidate*/ )
  1248. {
  1249.     AdjustFrame();
  1250.     if (fSuperView)
  1251.         fSuperView->AdjustFrame();
  1252. }
  1253.  
  1254. //----------------------------------------------------------------------------------------
  1255. // TMovieView::InvalidateCoordinates
  1256. //----------------------------------------------------------------------------------------
  1257. #pragma segment ARes
  1258.  
  1259. void TMovieController::InvalidateCoordinates()
  1260. {
  1261.     Inherited::InvalidateCoordinates();
  1262.  
  1263.     if (fMovieView)
  1264.         fMovieView->InvalidateMovieClip();
  1265. }
  1266.  
  1267.  
  1268. //----------------------------------------------------------------------------------------
  1269. // TMovieView::SetAutoSizeToMovie
  1270. //----------------------------------------------------------------------------------------
  1271. #pragma segment ARes
  1272.  
  1273. void TMovieController::SetAutoSizeToMovie(Boolean autoSize)
  1274. {
  1275.     fAutoSizeToMovie = autoSize;
  1276. }
  1277.  
  1278.  
  1279. //----------------------------------------------------------------------------------------
  1280. // TMovieView::SetPlayEveryFrame
  1281. //----------------------------------------------------------------------------------------
  1282. #pragma segment ARes
  1283.  
  1284. void TMovieController::SetPlayEveryFrame(Boolean playEveryFrame)
  1285. {
  1286.     fPlayEveryFrame = playEveryFrame;
  1287.  
  1288.     Boolean wasPlaying = FALSE;
  1289.     if (fMovieView && fMovieView->GetMovie())
  1290.     {
  1291.         fMovieView->GetMovie()->SetPlayEveryFrame(fPlayEveryFrame);
  1292.         wasPlaying = fMovieView->IsPlaying();
  1293.     }
  1294.  
  1295.     if (wasPlaying)
  1296.         fMovieView->GetMovie()->Stop();
  1297.  
  1298.     FailComponentErr(MCDoAction(fMovieController, mcActionSetPlayEveryFrame, (Ptr)fPlayEveryFrame));
  1299.  
  1300.     if (wasPlaying)
  1301.         fMovieView->GetMovie()->Start();
  1302. }
  1303.  
  1304.  
  1305. //----------------------------------------------------------------------------------------
  1306. // TMovieView::ComputeFrame
  1307. //----------------------------------------------------------------------------------------
  1308. #pragma segment ARes
  1309.  
  1310. void TMovieController::ComputeFrame(VRect& newFrame)
  1311. {
  1312.     Inherited::ComputeFrame(newFrame);
  1313.  
  1314.     if (fAutoSizeToMovie && fMovieView)
  1315.     {
  1316.         newFrame = newFrame - newFrame[topLeft];// zero base
  1317.  
  1318.         VRect movieFrame(GetFrame());
  1319.         newFrame = newFrame + VPoint(movieFrame.left, movieFrame.bottom);
  1320.         newFrame.right = newFrame.left + movieFrame.GetLength(hSel);
  1321.     }
  1322. }
  1323.  
  1324.  
  1325.  
  1326. //----------------------------------------------------------------------------------------
  1327. // TMovieView::DoSetupMenus
  1328. //----------------------------------------------------------------------------------------
  1329. #pragma segment ARes
  1330.  
  1331. void TMovieController::DoSetupMenus()            // override 
  1332. {
  1333.     Inherited::DoSetupMenus();
  1334.  
  1335.     if (fMovieView->HasMovie())
  1336.     {
  1337.         EnableCheck(cLoop, TRUE, fMovieView->fLoop);
  1338.         EnableCheck(cAutoRewind, TRUE, fMovieView->fAutoRewind);
  1339.  
  1340.         EnableCheck(cPlayWhenInactive, TRUE, fMovieView->fPlayWhenInactive);
  1341.  
  1342.         EnableCheck(cHalfSize, TRUE, fMovieView->fMovieSize[hSel] == halfSize || fMovieView->fMovieSize[vSel] == halfSize);
  1343.         EnableCheck(cNormalSize, TRUE, fMovieView->fMovieSize[hSel] == normalSize || fMovieView->fMovieSize[vSel] == normalSize);
  1344.         EnableCheck(cDoubleSize, TRUE, fMovieView->fMovieSize[hSel] == doubleSize || fMovieView->fMovieSize[vSel] == doubleSize);
  1345.  
  1346.         EnableCheck(cPlayEveryFrame, TRUE, fPlayEveryFrame);
  1347.     }
  1348. }
  1349.  
  1350. //----------------------------------------------------------------------------------------
  1351. // TMovieView::DoMenuCommand
  1352. //----------------------------------------------------------------------------------------
  1353. #pragma segment ARes
  1354.  
  1355. void TMovieController::DoMenuCommand(CommandNumber aCommandNumber)// override 
  1356. {
  1357.     switch (aCommandNumber)
  1358.     {
  1359.             //
  1360.             // Forward some cases to the MovieView
  1361.             //
  1362.         case cAutoRewind:
  1363.         case cLoop:
  1364.         case cPlayWhenInactive:
  1365.         case cHalfSize:
  1366.         case cNormalSize:
  1367.         case cDoubleSize:
  1368.             fMovieView->DoMenuCommand(aCommandNumber);
  1369.             break;
  1370.  
  1371.         case cPlayEveryFrame:
  1372.             SetPlayEveryFrame(!fPlayEveryFrame);
  1373.             break;
  1374.  
  1375.         default:
  1376.             Inherited::DoMenuCommand(aCommandNumber);
  1377.             break;
  1378.     }
  1379. }
  1380.  
  1381. //----------------------------------------------------------------------------------------
  1382. // End of UQuickTime.cp
  1383.  
  1384. #pragma segment Inline
  1385.  
  1386.